#!/bin/bash
# 每半小时 执行
if [ -z "$1" ] ; then
    deal_date=$(date -d "2 day ago" +%Y-%m-%d)
else
    deal_date=$1
fi


LOG_DIR="/home/cys/www/script/logs"
# 日志文件名包含日期，每次执行的日志前添加时间戳
FILE_NAME="calculate_retetion_channel"
LOG_FILE="${LOG_DIR}/${FILE_NAME}_$(date +%Y-%m-%d).log"
mkdir -p "${LOG_DIR}"
echo "" >> "${LOG_FILE}"
echo "" >> "${LOG_FILE}"
# 记录开始时间
echo "[$(date +%Y-%m-%d_%H:%M:%S)] 开始执行 clickhouse 命令" >> "${LOG_FILE}"
echo "处理日期：$deal_date" >> "${LOG_FILE}"

# 验证日期合法性（通过date命令解析，失败则报错）
if ! date -d "$deal_date" >/dev/null 2>&1; then
  echo "错误：输入的日期 $deal_date 不合法" >> "${LOG_FILE}"
  exit 1
fi


today=$(date +%Y%m%d)
diff_days=$(( ($(date -d "$today" +%s) - $(date -d "$deal_date" +%s)) / 86400 ))

echo "输入的日期 $deal_date 和今天相差 $diff_days 天" >> "${LOG_FILE}"

if (( $diff_days < 2 )); then
  echo "错误：输入的日期 $deal_date 必须至少是两天前的日期，以确保有足够的数据进行留存计算" >> "${LOG_FILE}"
  exit 1
fi

retetion_days=("1")

if [ $diff_days -gt 30 ]; then
    retetion_days=("1" "3" "7" "15" "30")
elif [ $diff_days -gt 15 ]; then
    retetion_days=("1" "3" "7" "15")
elif [ $diff_days -gt 7 ]; then
    retetion_days=("1" "3" "7")
elif [ $diff_days -gt 3 ]; then
    retetion_days=("1" "3")
else
    retetion_days=("1")
fi

echo "输入的日期 $deal_date retetion_days $retetion_days" >> "${LOG_FILE}"

# 遍历数组
for day in "${retetion_days[@]}"; do


  echo "[$(date +%Y-%m-%d_%H:%M:%S)] =============处理$day 天的留存数据数据==============" >> "${LOG_FILE}"

  clickhouse-client --password Keepgo123@cys -q "
   insert INTO db_cfx.t_data_cpa_user_retention
   (activate_date,channel,retention_type,retention_days,retention_count)
   WITH
   -- 第1步：定义我们的 新增用户队列
   -- 从累计用户表中获取指定时间段内所有的新增用户及其首次活跃日期
   NewUsers AS (
       SELECT
       channel,
           oaid,
           activate_date
       FROM db_cfx.t_data_user_cpa_new_final
       WHERE activate_date='${deal_date}'
   )
   -- 第2步：将新增用户与他们在后续日期的活跃记录进行关联
   SELECT
       nu.activate_date,
       nu.channel,
       2 as retention_type,
       ${day} as retained_day,
       -- 使用条件聚合计算留存用户数
       -- 如果一个用户在 (cohort_date + 3) 这天有活跃记录，则计入day3留存
       --uniq(if(ua.activate_date = nu.activate_date + ${day}, oaid, NULL)) AS retained_count
       count(if(ua.activate_date = nu.activate_date + ${day}, oaid, NULL)) AS retained_count
   FROM NewUsers as nu
   -- LEFT JOIN 是关键：确保所有新增用户都被保留，即使他们没有留存
   LEFT JOIN db_cfx.t_data_user_cpa_active_final as ua
     ON nu.oaid = ua.oaid
     and  nu.channel=ua.channel
       -- 只关联我们关心的留存日期（3, 7, 15日）
     and ua.activate_date=nu.activate_date + ${day}

   GROUP BY nu.activate_date,nu.channel
   ORDER BY nu.activate_date;
  "
  # 检查上一条命令是否执行成功
    if [ $? -eq 0 ]; then
      echo "[$(date +%Y-%m-%d_%H:%M:%S)]  $day 天的留存数据 插入成功" >> "${LOG_FILE}"
    else
      echo "[$(date +%Y-%m-%d_%H:%M:%S)] $day 天的留存数据 插入失败，quit"  >> "${LOG_FILE}"
      # 若需要失败即退出，取消下面一行的注释
      #exit 1
    fi
    sleep 5

done

echo "[$(date +%Y-%m-%d_%H:%M:%S)]  $deal_date 留存数据处理结束" >> "${LOG_FILE}"